#include <WordDataReader.hpp>
#include <cstdio>
#include <map>
#include <iostream>

WordDataReader::WordDataReader(std::string filename)
: filename(filename) {

}

std::vector<std::pair<std::string, unsigned> >*
WordDataReader::readData() {
	
	FILE * file = fopen(filename.c_str(), "r");
	
	//palavras nao podem ter mais do que 1023 letras
	char buffer[1024];

	std::string str;

	//m eh o indice para o vetor v
	//a string guarda as palavras contidas em v
	//e o int guarda a posicao em que a palavra foi armazenada
	std::map<std::string, int> m;
	
	//v guarda as palavras e a ocorrencia das mesmas no texto
	std::vector<std::pair<std::string, unsigned> >* v = 
		new std::vector<std::pair<std::string, unsigned> >();
	
	while (fscanf(file, "%1023[A-Za-z]", buffer) != EOF) {
		//coloca o conteudo de buffer em uma string
		str = buffer;
		
		//evitamos as palavras com uma letra apenas
		if(str.size() > 1)
		{
			std::map<std::string, int>::iterator it;
			it = m.find(str);

			//se a palavra nao tinha sido encontrada ainda,
			//coloca-a no fim do vetor, registra 1 como a ocorrencia 
			//e salva em m a posicao da palavra em v
			if (it == m.end()) {
				v->push_back(std::pair<std::string, unsigned> 
					(str, 1));
				m[str] = v->size() - 1;
			} 

			//senao incrementa o numero de ocorrencias
			else {
				(*v)[it->second].second++;
			}
		}
		
		//imprimindo o texto sem os caracteres especiais
		// fprintf(cleanText, "%s ", buffer);
		fscanf(file, "%*[^A-Za-z]");
	}

	fclose(file);
	// fclose(cleanText);

	return v;
}
